package com.peking.donations.base.util;

import java.security.SecureRandom;
import java.util.Random;

public class RandomUtil {

    public static String RandNumber(Long min, Long max) {
        Long temp = Math.round(Math.random() * (max - min) + min);
        return temp.toString();
    }

    public static String randNumberFixed(int length) {
        double random = Math.random();
        return String.valueOf(random).substring(2, 2 + length);
    }

    public static String randStringFixed(int length) {
        StringRandomGenerator randomGenerator = new StringRandomGenerator(length);
        return randomGenerator.generate();
    }

    static class StringRandomGenerator {
        private final char[] DEFAULT_CODEC = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
                .toCharArray();

        private Random random = new SecureRandom();

        private int length;

        /**
         * Create a generator with the default length (6).
         */
        public StringRandomGenerator() {
            this(6);
        }

        /**
         * Create a generator of random strings of the length provided
         *
         * @param length
         *            the length of the strings generated
         */
        public StringRandomGenerator(int length) {
            this.length = length;
        }

        public String generate() {
            byte[] verifierBytes = new byte[length];
            random.nextBytes(verifierBytes);
            return getAuthorizationCodeString(verifierBytes);
        }

        /**
         * Convert these random bytes to a verifier string. The length of the
         * byte array can be {@link #setLength(int) configured}. The default
         * implementation mods the bytes to fit into the ASCII letters 1-9, A-Z,
         * a-z .
         *
         * @param verifierBytes
         *            The bytes.
         * @return The string.
         */
        protected String getAuthorizationCodeString(byte[] verifierBytes) {
            char[] chars = new char[verifierBytes.length];
            for (int i = 0; i < verifierBytes.length; i++) {
                chars[i] = DEFAULT_CODEC[((verifierBytes[i] & 0xFF) % DEFAULT_CODEC.length)];
            }
            return new String(chars);
        }

        /**
         * The random value generator used to create token secrets.
         *
         * @param random
         *            The random value generator used to create token secrets.
         */
        public void setRandom(Random random) {
            this.random = random;
        }

        /**
         * The length of string to generate.
         *
         * @param length
         *            the length to set
         */
        public void setLength(int length) {
            this.length = length;
        }
    }
}
